package com.testing.base;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.List;

/**
 * 继承BasePageElement，封装了各个模块的操作方法，比如通用的断言判断当前页面标题是否含某文本，当前元素的文本值是否是指定版本等
 */
public class BasePageAction extends BasePageElement {

    public BasePageAction(WebDriver driver) {
        super(driver);
    }

    /**
     * 依次获取列表元素中的text文本进行比对
     * @param webElementList 元素列表
     * @param str 在列表中比对的值
     * @return 找到返回true，否则返回false
     */
    public boolean assertList(List<WebElement> webElementList, String str){
        for (WebElement element: webElementList){
            if (assertElementContainsText(element, str)){
                return true;
            }
        }
        return false;
    }

    /**
     * 检查一个WebElement是否包含指定的文本，并返回一个布尔值表示是否包含。
     *
     * @param element      要检查的WebElement
     * @param expectedText 期望包含的文本
     * @return 如果元素包含期望的文本，则返回true；否则返回false
     */
    public static boolean assertElementContainsText(WebElement element, String expectedText) {
        if (expectedText == null || expectedText.isEmpty()) {
            // 如果expectedText为空或null，直接返回false
            return false;
        }
        String actualText = element.getText();
        // 使用contains方法检查是否包含文本，而不是断言
        return actualText.contains(expectedText);
    }

    /**
     * 判断元素是否在页面出现，并返回一个布尔值。
     *
     * @param locateKey 元素定位
     * @return 定位到元素返回true；否则返回false
     */
    public boolean isElementPresent(String locateKey) {
        try {
            this.findElement(locateKey);
            return true;
        } catch (TimeoutException e) {
            return false;
        }
    }

    /**
     * 判断输入框是否处于禁用状态
     *
     * @param locateKey 元素定位
     * @return 输入框被禁用返回true
     */
    public boolean inputBoxIsDisable(String locateKey) {
        return !this.findElement(locateKey).isEnabled();  // 此方法在监测输入框被禁用时返回false，所以返回反例
    }

    /**
     * 执行js脚本方式点击元素
     *
     * @param iniKey ini文件中数据的key
     */
    public void jsClickElement(String iniKey) {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        WebElement element = findElement(iniKey);
        js.executeScript("arguments[0].click();", element);
    }

    /**
     * 在指定的 WebDriver 上下文中执行给定的 JavaScript 脚本。
     *
     * @param driver 执行脚本的 WebDriver 实例。
     * @param script 要执行的 JavaScript 脚本。
     * @return 脚本执行的结果，如果脚本没有返回值则返回 null。
     * @throws IllegalArgumentException 如果 driver 为 null 或者 script 为空字符串。
     */
    public static Object executeJS(WebDriver driver, String script) {
        if (driver == null) {
            throw new IllegalArgumentException("driver 不能为 null");
        }
        if (script == null || script.isEmpty()) {
            throw new IllegalArgumentException("script 不能为 null 或空字符串");
        }
        JavascriptExecutor js = (JavascriptExecutor) driver;
        return js.executeScript(script);
    }
}
